<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8" />
        <link rel="stylesheet" href="styles/style.css">
        <link rel="stylesheet" href="styles/theme/atom-one-dark.css">
        <title>例子27-JS进阶（二）</title>
    </head>

    <body>
        <pre>
            <code>
                    // 例子27

                    // 先创建一个构造函数
                    var Person = function(name, age) {
                        this.name = name;
                        this.age = age;
                        this.getName = function() {
                            return this.name;
                        }
                    }

                    // 将构造函数以参数形式传入
                    function New(func) {

                        // 声明一个中间对象，该对象为最终返回的实例
                        var res = {};
                        if (func.prototype !== null) {

                            // 将实例的原型指向构造函数的原型
                            res.__proto__ = func.prototype;
                        }

                        // ret为构造函数执行的结果，这里通过apply，将构造函数内部的this指向修改为指向res，即为实例对象
                        var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));

                        // 当我们在构造函数中明确指定了返回对象时，那么new的执行结果就是该返回对象
                        if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
                            return ret;
                        }

                        // 如果没有明确指定返回对象，则默认返回res，这个res就是实例对象
                        return res;
                    }

                    // 通过new声明创建实例，这里的Tom，实际接收的正是new中返回的res
                    var Tom = New(Person, 'Tom', 20);
                    console.log(Tom.getName());

                    // 当然，这里也可以判断出实例的类型了
                    console.log(Tom instanceof Person); // true
            </code>
        </pre>
        <script src="scripts/libs/highlight.pack.js"></script>
        <script src="scripts/27.js"></script>
        <script>
            hljs.initHighlightingOnLoad();
        </script>
    </body>

</html>